package cn.swing.ushare.article.service;

import cn.swing.ushare.pojo.entity.Article;
import cn.swing.ushare.pojo.entity.ArticlePicture;
import cn.swing.ushare.pojo.entity.Category;
import cn.swing.ushare.pojo.vo.*;
import org.springframework.stereotype.Repository;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * 处理文章的业务逻辑层接口
 */
@Repository
public interface IArticleService {

    /**
     * *********************************** insert **********************************************************************
     */

    //添加新的类别
    int insertCategory(Category category);

    /**
     * 根据用户发表的文章向数据库中存入文章图片
     * @param articlePicture
     * @return 受影响的行数
     */
    int insertArticlePictures(ArticlePicture articlePicture);

    /**
     * 发布的文章插入数据库
     * @param article 前台提供的文章
     * @return 受影响的行数
     */
    int insertArticle(Article article);


    /**
     * *********************************** delete **********************************************************************
     */

    /**
     * 根据后台管理页面文章列表提交的id删除数据库中对应的文章
     * @param id 后台管理页面文章列表提交的id
     * @return 受影响的行数
     */
    int deleteArticleById(Long id);


    /**
     * 批量删除文章
     * @param ids 要删除文章的id
     * @return 受影响的行数
     */
    int batchDeleteArticleByIds(Long[] ids);

    /**
     * 删除类别
     * @param id 类别id
     * @return 受影响的行数
     */
    int deleteCategoryById(Long id);

    /**
     * 批量删除类别
     *
     * @param ids 分类id
     * @return 受影响的行数
     */
    int batchDeleteCategoryById(Long[] ids);


    /**
     * *********************************** select **********************************************************************
     */

    /**
     * 根据分类名称查询分类
     * @return 对应的类别
     */
    List<CategorySimpleVO> selectSimpleCategoryByName(Integer currentPage,String categoryName);

    /**
     * 根据当前页码和分类名称查找分类列表显示在后台页面
     * @param currentPage 要查询的页码
     * @return 对应的类别
     */
    List<CategorySimpleVO> selectSimpleCategoryList(Integer currentPage);

    /**
     * 查询根据当前条件分类的总条数
     * @param categoryName 分类名字
     * @return 总条数
     */
    Integer selectCategoryCount(String categoryName);


    /**
     * 统计文章总数
     * @return 总数
     */
    Integer countAllArticle();

    /**
     * 查询排名前十的文章
     * @return 前十的文章信息
     */
    List<ArticleTopSimpleVO> topTenList();

    /**
     * 查询数据库中的所有文章,并封装在ArticleDetailsVO中
     *
     * @return 文章的list集合
     */
    List<ArticleDetailsVO> getAllArticles(Integer page, Integer index, Integer type, Integer category);


    /**
     * 根据文章状态查询文章
     * @param state 文章状态
     * @return 文章状态为私密、公开、审核中的文章
     */
    List<ArticleDetailsVO> selectArticleByState(Long state);

    /**
     * 根据文章类型查询文章
     * @param type 文章类型 0为原创 1为转载
     * @return 文章状态为type的文章
     */
    List<ArticleDetailsVO> selectArticleByType(Integer type);

    /**
     * 查询所有文章类别
     * @return 文章id和名字
     */
    List<CategorySimpleVO> selectSimpleCategory(Integer current);

    /**
     * 根据分类名称查询分类
     * @param name 分类名称
     * @return 对应的类别
     */
    List<CategorySimpleVO> selectSimpleCategoryByName(String name);

    /**
     * 根据文章类别查询文章
     * @param categoryId 文章id
     * @return
     */
    List<ArticleDetailsVO> selectArticleByCategoryId(Integer categoryId);

    /**
     * 根据文章标题查询文章
     * @param title 文章标题
     * @return 返回对应的文章
     */
    List<ArticleDetailsVO> selectArticleByTitle(String title,Integer currentPage);

    /**
     * 查询根据文章标题查询文章总条数
     * @param title 文章标题
     * @return
     */
    Integer articleCountByTitle(String title);

    /**
     * 根据ID查找文章内容
     *
     * @param id 文章ID
     * @return 文章内容
     */
    ArticleDetailsVO selectArticleDetailsById(Integer id);

    /**
     * 根据文章ID查找文章对应的图片
     * @param id
     * @return
     */
    List<String> selectArticlePicturesById(Integer id);


    /**
     * 根据ID查找文章简单的内容（title、categoryName、gmtCreate）
     * @param id
     * @return 返回对应的文章内容
     */
    List<ArticleSimpleVO> selectArticleSimpleById(Integer id);

    /**
     * 查询文章显示到前台首页
     * @return 返回文章
     */
    List<ArticleHomeVO> selectArticleHome();

    /**
     * 查询文章到热门
     * @return 返回文章
     */
    List<ArticleHomeVO> selectHotArticle();

    /**
     * 根据用户ID查询收藏的文章
     * @param userId
     * @return
     */
    List<ArticleSimpleVO> selectArticleCollectionByUserId(Integer userId);




    /**
     * 根据文章和用户ID查询是否点赞过对应文章
     * @param articleId
     * @param userId
     * @return
     */
    Integer selectIsLovedByUserIdAndArticleId(Integer articleId, Integer userId);

    /**
     * 根据文章ID和用户ID删除点赞字段
     * @param articleId
     * @param userId
     * @return
     */
    Integer deleteIsLovedByUserIdAndArticleId(Integer articleId, Integer userId);

    /**
     * 根据文章ID和用户ID新增点赞字段
     * @param articleId
     * @param userId
     * @return
     */
    Integer insertIsLovedByUserIdAndArticleId(Integer articleId, Integer userId);

    /**
     * 根据ID新增文章点赞数
     * @param id
     * @return
     */
    Integer addArticleLoveCountById(Integer id);

    /**
     * 增加用户表中的点赞量
     * @param userId
     * @return
     */
    int addUserLoveCount(Integer userId);

    /**
     * 减少用户表中的点赞量
     * @param userId
     * @return
     */
    int subUserLoveCount(Integer userId);

    /**
     * 根据ID减少文章点赞数
     * @param id
     * @return
     */
    Integer subArticleLoveCountById(Integer id);

    /**
     * 根据用户ID和文章ID建立收藏表
     * @param articleId
     * @param userId
     * @return
     */
    Integer addArticleCollection(Integer articleId, Integer userId);

    /**
     * 根据用户ID和文章ID删除收藏表
     * @param articleId
     * @param userId
     * @return
     */
    Integer deleteArticleCollection(Integer articleId, Integer userId);

    /**
     * 查询当前文章的收藏状态
     * @param articleId
     * @param userId
     * @return
     */
    Integer selectArticleCollectionStatus(Integer articleId, Integer userId);

    /**
     * 根据ID新增文章收藏量
     * @param id
     * @return
     */
    Integer addArticleCollectionCounts(Integer id);


    /**
     * 根据ID减少文章收藏量
     * @param id
     * @return
     */
    Integer subArticleCollectionCounts(Integer id);

    /**
     * 查询文章显示到前台频道
     * @param categoryId 分类id
     * @param sortId 排序方式
     * @return 对应的文章
     */
    List<ArticleHomeVO> selectArticleToChannel(Integer categoryId,Integer sortId);

    /**
     * 文章详情页相关推荐
     * @param categoryId
     * @return
     */
    List<ArticleHomeVO> selectArticleToRecommend(Integer categoryId);


    /**
     * 分页查询总页数
     *
     * @return
     */
    Integer articlesCount(Integer index, Integer type, Integer category);


    /**
     * 根据文章ID增加浏览量（不存在降低浏览量的说法）
     * @param id
     * @return
     */
    Integer addArticleViews(Integer id);




    /**
     * 查询当前用户发表的最新的文章
     * @param userId
     * @return
     */
    Integer selectCurrentUserNewArticle(Integer userId);

    /**
     * 根据关键词搜索文章
     * @param keyword
     * @return
     */
    List<ArticleResultVO> searchArticles(String keyword, Integer page);

    /**
     * 根据关键词获取搜索总数
     * @param keyword
     * @return
     */
    Integer getSearchCounts(String keyword);

    /**
     * 上传图片
     * @param picFile 图片名
     * @return 独一无二的图片名
     */
    String uploadPictures(MultipartFile picFile) throws Exception;

    /**
     * 删除已经上传的图片
     * @param pictureName 图片名
     */
    void removePicture(String pictureName);

    /**
     * 得到文章封面
     * @param ruleForm
     * @return
     */
    Article getArticleCover(String ruleForm);

    /**
     * 插入图片路径
     * @param ruleForm
     * @return
     */
    List<String> getPicturePath(String ruleForm);
}
